package com.shujia

import scala.collection.{immutable, mutable}

object Demo14Map {
  def main(args: Array[String]): Unit = {
    /**
     * Map ：K-V格式
     * 不可变的、无序的
     */
    val map: Map[String, String] = Map(("k1", "v1"), ("k2", "v2"), "k3" -> "v3")

    println(map)

    // 返回迭代器
    // 同List的区别在于：迭代器只能遍历一次 List可以遍历多次；迭代器中的数据不会直接加载到内存中，在需要的时候才会去取
    val iter: immutable.Iterable[String] = map.map(t2 => {
      val key: String = t2._1
      val value: String = t2._2
      key + value
    })

    println(iter)

    // 查：根据key获取value
    println(map("k1"))
    // get方法返回值类型为：Option
    // Option 下面就两个子类：Some、None
    // 在Map中通过key获取value，对于使用者来说key到底存不存在是未知的
    // 所以get方法的返回值是不确定的 可能有 可能没有
    // 那这个时候就可以返回一个Option
    println(map.get("k2")) // Some(v2)
    println(map.get("kk2")) // None
    println(map.getOrElse("k3", "key不存在即返回")) // v3
    println(map.getOrElse("kk3", "key不存在即返回")) // key不存在即返回

    // 判断key存不存在
    println(map.contains("k1"))
    println(map.contains("kk1"))

    // 可变的Map
    val map2: mutable.HashMap[String, String] = mutable.HashMap("k1" -> "v1", ("k2", "v2"))
    map2.+=("k3" -> "v3")
    println(map2)
    map2.-=("k2")
    println(map2)

    // wordCount
    val words: List[String] = List("java,scala,python", "java,scala,python", "java,scala,python", "Hadoop,Hive,HBase", "Spark,Flink,MapReduce")

    words.foreach(println)

    // wordCount
    val splitWords: List[String] = words.flatMap(line => {
      line.split(",")
    })

    // 分组
    val groupWords: Map[String, List[String]] = splitWords.groupBy(w => w)

    groupWords.map(kv => {
      val word: String = kv._1
      val words: List[String] = kv._2
      val count: Int = words.length
      word + "," + count
    }).foreach(println)

    groupWords.map {
      case (word: String, words: List[String]) => {
        word + "," + words.length
      }
    }.foreach(println)

    val tupMap: Map[(String, String), (String, String)] = Map(("k1", "kk1") -> ("v1", "vv1"), ("k2", "kk2") -> ("v2", "vv2"))

    tupMap.foreach(println)

    tupMap.map {
      case ((k1: String, kk1: String), (v1: String, vv1: String)) => {
        s"$k1,$v1,$kk1,$vv1"
      }
    }.foreach(println)

  }

}
